/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ssdd.chaski.net;

import com.ssdd.chaskinet.login.LoginVerifier;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import java.util.List;
import java.util.StringTokenizer;

/**
 *
 * @author jheorge
 */
public class Conexion extends Thread {

    private Socket s;
    private DataInputStream dis;
    private DataOutputStream dos;

    //crea una nueva instancia de Conexion
    public Conexion(Socket s) {
	this.s = s;
	try {
	    dis = new DataInputStream(s.getInputStream());
	    dos = new DataOutputStream(s.getOutputStream());
	    start();
	} catch (Exception e) {
	}
    }

    public void run() {
	while (true) {
	    try {
		String sMensaje = dis.readUTF();
		System.out.println(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::");
		System.out.println("[SERVER] mensaje revibido: " + sMensaje);
		StringTokenizer token = new StringTokenizer(sMensaje, "#$#");
		String codigo = token.nextToken();
		if (codigo.equals("MSG")) {
		    String mensaje = token.nextToken();
		    System.out.println("[SERVER] Mensaje :" + mensaje);
		    String usuarioO = token.nextToken();
		    System.out.println("[SERVER] usuarioO :" + usuarioO);
		    while (token.hasMoreTokens()) {
			String recipient = token.nextToken();
			System.out.println("[SERVER] enciando a: :" + recipient);
			GestorConexiones.getInstance().enviarMensaje(recipient, sMensaje);//"MSG#$#" + mensaje + "#$#" + usuarioO);
		    }
		} else if (codigo.equals("LG"))// ises LG
		{
		    System.out.println("entro a validar usuario");
		    String user = token.nextToken();
		    String pass = token.nextToken();
		    LoginVerifier l = new LoginVerifier();
		    String r = l.userVerification(user, pass);
		    System.out.println("validation : " + r);
		    String response = "LG#$#" + r;
		    System.out.println("validation : " + response);
		    if (r.equals("VALID")) {
			GestorConexiones.getInstance().updateList(user);
		    } else {
			GestorConexiones.getInstance().removerUsuario("NEW");
		    }
		    enviarMensaje(response);
		    // enviar a todos el nuevo usuario
		    List<String> userListTmp = GestorConexiones.getInstance().getUsersList2(user);
		    for (String string : userListTmp) {
			System.out.println("enviar mensaje a " + string);
			String messageUser = GestorConexiones.getInstance().getUsersList(string);
			GestorConexiones.getInstance().enviarMensaje(string, "UC" + messageUser);
		    }
		} else if (codigo.equals("UC")) {
		    String user = token.nextToken();
		    String resp = GestorConexiones.getInstance().getUsersList(user);
		    enviarMensaje("UC" + resp);
		} else if (codigo.equals("LGO")) {

		    String user = token.nextToken();
		    System.out.println("entro a deslogueo ::::: " + user);
		    // lo quitamos de la lista de usuarios
		    GestorConexiones.getInstance().removerUsuario(user);
		    // enviamos a todos los demas usuarios para que lo quiten de la lista
		    List<String> userList = GestorConexiones.getInstance().getUsersList2(user);
		    for (String userName : userList) {
			System.out.println("enviar mensaje de LGO : " + userName);
			if (!userName.equals(user)) {
			    System.out.println("enviando mensaje de deslogueo a : " + userName);
			    GestorConexiones.getInstance().enviarMensaje(userName, sMensaje);
			}
		    }
		}
	    } catch (Exception e) {
	    }
	}
    }

    public void enviarMensaje(String mensaje) {
	try {
	    System.out.println("enviando mensaje a socket : " + mensaje);
	    dos.writeUTF(mensaje);
	} catch (Exception e) {
	}
    }
}
